"""

    在python中有三种常见的方法类型
        1.实例方法
            self
        2.类方法
            cls
            @classmethod
        3.静态方法
            @staticmethod

    1.如何定义
    2.如何调用
    3.如何区分


    实例方法:
        实例方法的第一个参数必须是实例对象.该参数一般约定为self.是用来传递实例的属性和方法的
            也可以传递类的属性和方法
        只能通过实例来调用
    类方法
        类方法使用装饰器@classmethod.第一个参数必须是当前类对象.约定为cls.用于传递类属性和类方法
        通过类对象或者实例对象来完成类方法的调用

        原则上来说.类方法是将类本身看做一个对象来进行操作的方法.假设有一个方法.在逻辑上这个方法由类本身来完成调用更合理
        那这个方法就需要修改为类方法.
            有两个类:班级类和学生类
            基于这两个类实现两个功能
                1.班级人数增加的功能
                2.汇总班级人数的功能
            学生类继承班级类.
                每实例化一个学生.班级的人数自动增加


    静态方法
        静态方法使用装饰器@staticmethod.没有约定的参数 没有self和cls.但是方法体中不能使用类或者实例的任意属性和方法.
        通过类对象或者实例对象来完成类方法的调用

        类中的静态方法是用来存放逻辑的.逻辑上属于类.但是和类本身没有任何关系.已经脱离了.可以这么认为.静态方法是完全独立的的函数.
            只是托管于某个类名空间.便于维护和使用!



"""

class A(object):
    # 类属性
    i = 0

    def __init__(self):
        # 实例属性
        self.j = 10


    # 实例方法 .self不需要我们人工传参.有python解释器自动帮我们完成参数的传递
    def method1(self):
        print("This is object method")

    @classmethod
    def method2(cls):
        print("This is class method")

    @staticmethod
    def method3():
        #print(i)
        #print(self.j)
        #method1()
        #method2()
        print("This is static method")



#TypeError: method1() missing 1 required positional argument: 'self'
#A.method1()
A().method1()

A.method2()
A().method2()

A.method3()
A().method3()